<?php
class Controleur {

	public $request;
	//objet Request
	private $vars = array();
	//Variables � passer � la vue
	public $layout = 'default';
	//Layout � utiliser pour rendre � la vue
	private $rendered = false;
	//Si le rendu a �t� fait ou pas?

	/**
	 * Constructeur
	 * @param $request Objet request de notre application
	 **/

	function __construct($request = null) {
		//Cr�ation d'une instance de Session et de Form pour les sessions et les formulaires
		$this -> Session = new Session();
		$this -> Form = new form($this);

		if ($request) {
			$this -> request = $request;
			// On stock la request dans l'instance
			require ROOT . DS . 'config' . DS . 'hook.php';
		}

		//Permet d'afficher connexion ou d�connexion ainsi qu'un lien vers son espace personnel en fonction de son rang
		if ($this -> Session -> isLogged()) {
			$d = $this -> Session -> read();
			$rang = $d['User']['cactus'];
			$etat = array('co' => 'Deconnexion', 'lien' => '/user/logout', 'profil' => 'Cactusland', 'lienp' => '/joueur/cactusland');
		} else {
			$etat = array('co' => 'Connexion', 'lien' => '/user/login', 'profil' => 'Inscription', 'lienp' => '/user/signup/');

		}
		$this -> set($etat);
	}

	/**
	 *
	 * Permet de rendre une vue
	 * @param $view Fichier � rendre(chemin depuis Vue ou nom de la vue)
	 **/
	public function render($view) {
		//On ne retourne pas une vue d�j� retourn�e
		if ($this -> rendered) {
			return false;
		}

		$d['selected'] = 1;
		if ($view == "signup" || $view == "cactusland")
			$d['selected'] = 2;
		elseif ($view == "login")
			$d['selected'] = 3;
		elseif ($view == "reglement")
			$d['selected'] = 4;

		$this -> set($d);

		//On extrait les variables pour les envoyer � la vue
		extract($this -> vars);
		//On va chercher la vue dans le dosser qui correspond
		if (strpos($view, '/') === 0) {
			$view = ROOT . DS . 'Vue' . $view . '.php';
		} else {
			$view = ROOT . DS . 'Vue' . DS . $this -> request -> controleur . DS . $view . '.php';

		}

		//on lance le layout c'est � dire le fond html qui reste statique pour chaque page
		ob_start();
		require ($view);
		$content_for_layout = ob_get_clean();
		require ROOT . DS . 'Vue' . DS . 'layout' . DS . $this -> layout . '.php';
		$this -> rendered = true;
	}

	/**
	 * Permet de passer une ou plusieurs variable � la vue
	 * @param $key nom de la variable OU tableau de variables
	 * @param $value Valeur de la variable
	 **/

	public function set($key, $value = NULL) {
		if (is_array($key)) {
			$this -> vars += $key;
		} else {
			$this -> vars[$key] = $value;
		}

	}

	/**
	 * Permet de charger un model au niveau du controleur
	 **/

	public function loadModel($name) {
		//On verifie que le mod_le existe pour le lancer apr�s

		if (!isset($this -> $name)) {$file = ROOT . DS . 'Modele' . DS . $name . '.php';
			require_once ($file);
			$this -> $name = new $name();
			//On lance le formulaire du mod�le pour que celui ci puisse l'utiliser (pour envoyer des messages d'erreurs par exemple)
			if (isset($this -> Form))
				$this -> $name -> Form = $this -> Form;

		}
	}

	/**
	 * Permet de g�rer les erreurs 404
	 */
	function e404($message) {
		header("HTTP/1.0 404 Not Found");
		$this -> set('message', $message);
		$this -> render('/errors/404');
		die();
	}

	/**
	 * Permet d'appeler un controleur depuis une vue
	 */

	function request($controleur, $action) {//Appel et lance le controleur
		$controleur .= 'Controleur';
		require_once ROOT . DS . 'controleur' . DS . $controleur . '.php';
		$c = new $controleur();
		//retourne les r�sultats de la m�thode demand�e
		return $c -> $action();
	}

	/**
	 *
	 * Permet de faire des redirections
	 * @param $url url de redirection
	 * @param  $code code de la page
	 */
	function redirect($url, $code = null) {
		if ($code == 301) {
			header("HTTP/1.1 301 Moved Permanently");
		}

		header("Location:" . BASE_URL . '/' . $url);
	}

	/***********************************************/
	/**
	 *
	 * M�thode qui permet de d�composer les dates pour pouvoir les enregistrer dans la base de donn�es
	 * on extrait chaque valeur gr�ce � substr
	 * @param Date $value date � convertir
	 */
	function decomposedate($value) {
		$jour = substr($value, 0, 2);
		$mois = substr($value, 3, 2);
		$annee = substr($value, 6, 4);
		return $annee . '-' . $mois . '-' . $jour;
	}

	/************************************************/

	/**
	 *
	 * M�thode qui permet de d�composer les dates de la base de donn�es et les remettre dans le bon ordre pour le formulaire
	 * @param Date $value date � convertir
	 */
	function recomposedate($value) {
		$jour = substr($value, 8, 2);
		$mois = substr($value, 5, 2);
		$annee = substr($value, 0, 4);
		return $jour . '/' . $mois . '/' . $annee;
	}

}
?>